# 小扣出去秋游，途中收集了一些红叶和黄叶，他利用这些叶子初步整理了一份秋叶收藏集 `leaves`， 字符串 `leaves` 仅包含小写字符 `r` 和 `
# y`， 其中字符 `r` 表示一片红叶，字符 `y` 表示一片黄叶。
# 出于美观整齐的考虑，小扣想要将收藏集中树叶的排列调整成「红、黄、红」三部分。每部分树叶数量可以不相等，但均需大于等于 1。每次调整操作，小扣可以将一片红叶替
# 换成黄叶或者将一片黄叶替换成红叶。请问小扣最少需要多少次调整操作才能将秋叶收藏集调整完毕。
# 
# **示例 1：**
# >输入：`leaves = "rrryyyrryyyrr"`
# >
# >输出：`2`
# >
# >解释：调整两次，将中间的两片红叶替换成黄叶，得到 "rrryyyyyyyyrr"
# 
# **示例 2：**
# >输入：`leaves = "ryr"`
# >
# >输出：`0`
# >
# >解释：已符合要求，不需要额外操作
# 
# **提示：**
# - `3 <= leaves.length <= 10^5`
# - `leaves` 中只包含字符 `'r'` 和字符 `'y'` 👍 22 👎 0


# leetcode submit region begin(Prohibit modification and deletion)
class Solution:
    def minimumOperations(self, leaves: str) -> int:

        # 暴力枚举 (i,j)， （0，i) (i,j) (j,n)
        n = len(leaves)

        def times(start, end):
            res = 0

            for i in range(0, start):
                if leaves[i] == 'y':
                    res += 1
            for j in range(start, end):
                if leaves[j] == 'r':
                    res += 1
            for k in range(end, n):
                if leaves[k] == 'y':
                    res += 1
            return res

        min_res = n
        for i in range(1, n - 1):
            for j in range(i + 1, n):
                min_res = min(min_res, times(i, j))

        return min_res

    #

    def solve(self, leaves: str) -> int:

        n = len(leaves)
        left = [0] * n
        right = [0] * n

        left[0] = 1 if leaves[0] == 'y' else 0

        right[n - 1] = 1 if leaves[n - 1] == 'y' else 0

        c = 0
        for i in range(0, n):
            if leaves[i] == 'y':
                left[i] = c + 1
            else:
                left[i] = c
            c = left[i]

        res = 0

        for i in range(1, n - 1):
            for j in range(i + 1, n - 1):
                res = min(res, left[i - 1] + (j - i + 1) - (left[j] - left[i]) + right[j])


# leetcode submit region end(Prohibit modification and deletion)

print(Solution().minimumOperations("rrryyyrryyyrr"))
